/**
 *------------------------------------------------------------------------------
 *  @copyright Copyright (c) 2022  <dx_65535@163.com>. 
 * 
 *  @file       : message_poll.h
 *  @author     : Xiang.D (dx_65535@163.com)
 *  @version    : 1.0
 *  @brief      : Blog: https://linuxtaoist.gitee.io
 *  @date       : 2022-06-04
 * 
 * 
 *  Change History:
 *  <Date>     | <Version> | <Author>       | <Description>
 *------------------------------------------------------------------------------
 *  2022/06/04 | 1.0.0.1   | Xiang.D        | Create file
 *------------------------------------------------------------------------------
 * 
 */

#ifndef __MESSAGE_EPOLL_H__
#define __MESSAGE_EPOLL_H__

#include <map>
#include <queue>
#include <thread>
#include <signal.h>
#include "msg_queue.h"
#include "message_epoll.h"
#include "common_type.h"
#include "behavior_base.h"
#include "data_protocol_factory.h"

typedef struct
{
    int fd;
    CDataParse*  pDataParse;
    MsgHanderPtr handler;
} SPollEvent;

/**
 * @brief epoll 消息监听类
 */
class CMsgEpoll
{
public:
    /** 
     * @brief       单例
     */
    static CMsgEpoll* GetInstance();

    /** 
     * @brief       析构
     */
    ~CMsgEpoll();

    /** 
     * @brief       初始化
     */
    void Init();

    /** 
     * @brief       退出
     */
    void Exit();

    /** 
     * @brief       添加监听事件
     *
     * @param[in]   fd 事件句柄
     * @param[in]   channel 消息源通道
     */
    void AddPoll(int fd, ETransChannel channel, MsgHanderPtr handler);

    /** 
     * @brief       启动
     */
    void Run();

    /** 
     * @brief       开始监听
     *
     * @param[in]   run 开启/暂停监听
     */
    void StartEpoll(bool run);

    /** 
     * @brief       删除监听事件
     *
     * @param[in]   p 事件类
     */
    void DelPoll(int fd);

    /** 
     * @brief       发送命令至处理函数
     *
     * @param[in]   frame 数据帧
     */
    int Invoke(SMsgEventPacket &msgPacket);

    /** 
     * @brief       读取消息，任务调度
     */
    void TaskSchedule();

private:
    int mFd;
    int mSigFd;
    bool mQuit;
    std::thread mEpollThread;
    std::thread mScheduleThread;
    CDataProtocolFactory mDataParseFactory;
    std::map<ECmdType, CBeahaviorBase *> mCmdTable;
    std::queue<SCmdFrame> mMsgQueue;
    std::map<int, SPollEvent *> mEpollTable;
    pthread_mutex_t mMsgQueueMutexLock;

    /** 
     * @brief       构造
     *
     * @param[in]   size 最大监听数目
     */
    explicit CMsgEpoll(int size);
};

#endif


